home *** CD-ROM | disk | FTP | other *** search
- TITL ' TMS7041 MODEM RUN CODE '
- IDT 'RUN2'
- OPTION XREF,TUNLST
- ************************************************************
- ** 300bps Modem Operation. **
- ** This code handles the run time operation and **
- ** communication of the modem. This includes the DTE **
- ** interface, 320 interface, and overspeed operations. **
- ** **
- ** Written by Peter Ehlig **
- ** **
- ** Revision 1.1 12/12/85 PETER EHLIG **
- ** Revision 1.2 1/27/86 PETER EHLIG **
- ** Revision 1.2 5/20/86 PETER EHLIG **
- ** **
- ** COPYRIGHT TEXAS INSTRUMENTS, 07/25/86 **
- ** **
- ************************************************************
- *
- * DEFINITIONS AND REFERENCES
- DEF B103
- REF TOP,PRINT
- *
- PAGE
- COPY DTE2.EQU
- *******----------------------------------------*******
- ***** DSP XMIT/RECEIVE ROUTINES *****
- *******----------------------------------------*******
- *
- B103 EQU $
- CLR CWT1 ; CLEAR TIMEOUT COUNTER
- CLR CWT2 ; FOR DELAY OF CARRIER LOSS
- CLR CMSTAT ; ALSO SAMPLE/BAUD COUNT
- SNDMK MOV %>21,A SEND MARK TO 320
- SND03 MOVP %>3F,DDDR ; TURN DPORT LINES OUT
- ANDP %>C0,DPORT ; CLEAR OFF CURRENT BITS
- MOVP A,DPORT ; SEND OUT SCRAM MARKS
- ANDP %NOT6,BPORT ; LATCH NEW DATA
- ORP %BIT6,BPORT ; RESET READ BIT
- MOVP %>00,DDDR ; Reset DPORT as all inputs
- *
- * TRANSMIT UNSCRAMBLED MARKS AND RECEIVE
- SRC1 BTJZP %BIT7,DPORT,SRC2 ; WAIT FOR WRITE FROM 320
- SHKTCH BTJOP %BIT6,DPORT,RDTE ; WAIT FOR READ FROM 320
- BR @SRC3 ; PROCESS READ FROM 320
- RDTE BTJOP %BIT1,SSTAT,DTEG ; IS DTE REC BUF FULL
- XDTE BTJOP %BIT0,SSTAT,DTEP ; IS DTE TRANS BUF EMPTY
- JMP SRC1 ; LOOK AGAIN
- *
- PAGE
- *
- * CODE INTERFACE TO DTE
- *
- DTEG EQU $
- MOVP RXBUF,A ; YES, GET THE CHARACTER?
- BTJZ %BIT4,SWSTAT,OVRSQ ; IS ESC ENABLED?
- CMP %>1B,A ; IF A <> ESCAPE
- JNE OVRSQ ;--- (JNE to enable)- THEN CONTINUE
- * ; PATCH >E6 TO >E0 TO DISABLE
- * ; ESCAPE SEQUENCE
- SQU03 CLR A ; CLEAR COMMAND BUFFER
- MOVP %>3F,DDDR ; TURN DPORT OUT
- MOVP A,DPORT ; RESET COMMAND
- ANDP %NOT6,BPORT ; RESET THE READ ACKNOWLEDGE
- ORP %BIT6,BPORT ; LATCH SQUELCH COMMAND
- MOVP %>00,DDDR ; TURN DPORT IN
- ANDP %NOT0,BPORT ; TURN OFF THE CODEC
- BR @TOP ; AND RETURN TO MONITOR
- OVRSQ INC XCHCNT ; INCREMENT BYTE COUNT
- BTJO %BIT5,CMSTAT,DTEGER ; CHECK FOR BUF2 FULL
- BTJO %BIT3,CMSTAT,DTEG1 ; CHECK IF 1ST CHAR
- OR %BIT7,CMSTAT ; FLAG FOR START BIT
- MOV A,XBUF1 ; IF SO THEN RESTART
- MOV %>A,XBTCNT ; SET BIT COUNT TO 10
- OR %BIT3,CMSTAT ; SET TRANS ACTIVE
- JMP XDTE ; CHECK OUTPUT
- DTEG1 MOV A,XBUF2 ; SAVE IT IN THE BUF2
- OR %BIT5,CMSTAT ; SET BUF2 FULL FLAG
- JMP XDTE ; CHECK OUTPUT
- *
- DTEGER EQU $ ; SQUELCH THE MODEM
- MOVD %BUFERR,MSGL ; SEND ERROR MESSAGE
- CALL @PRINT ; TO USER TERMINAL
- JMP SQU03 ; EXIT ROUTINE
- *
- DTEP EQU $
- BTJZ %BIT4,CMSTAT,SRC1 ; CHECK FOR CHARACTER READY
- MOV RBUF2,A ; GET BUFFERED CHARACTER
- MOVP A,TXBUF ; SEND IT TO THE DTE
- AND %NOT4,CMSTAT ; RESET BUFFER FULL FLAG
- JMP SRC1 ; RETURN TO FLAG LOOP
- *
- PAGE
- * RECEIVE BIT FROM THE 320
- * 320 just finished writing to the buffer
- * DPORT IS SET TO ALL INPUTS EXCEPT WHEN 7742 IS OUTPUT
- SRC2 EQU $
- ANDP %NOT7,BPORT ; TOGGLE B7 TO ENABLE RECEIVE
- * LATCH AND TO RESET 320 WRITE ACKNOWLEDGE(WACK)
- *
- MOVP DPORT,A ; GET THE RETURNED DATA
- MOV A,XDIBIT ; AND HOLD IT IN XDIBIT
- ORP %BIT7,BPORT ; TURN LATCHES OFF AFTER READ
- BTJZ %BIT5,A,CHKTO ; IF NO CARRIER THEN DONE
- CLR CWT1 ; CLEAR DCD TIMOUT COUNTER
- CLR CWT2 ; CLEAR DCD TIMOUT COUNTER
- NEWBIT BTJO %BIT2,CMSTAT,RCH1 ; CHECK FOR REC CHAR ACTIVE
- *
- RRC XDIBIT ; CHECK DIBIT1
- JNC OVRR3 ; IF HIGH CHECK XMTCHR
- BR @SHKTCH ; ELSE GO BACK TO LOOP
- OVRR3 EQU $
- MOV %8,RBTCNT ; SET REC BIT COUNT REG
- OR %BIT2,CMSTAT ; SET REC CHAR ACTIVE
- BR @RDTE ; CHECK DTE
- *
- RCH1 SUB %1,RBTCNT ; CHECK BIT POSITION
- JP RCH2 ; IF > 0 GET 2 BITS
- *
- RRC XDIBIT ; PUT BIT7 INTO
- RRC RBUF1 ; REC CHAR HOLD REG
- MOV RBUF1,RBUF2 ; PUT CHAR IN OUT BUFFER
- OR %BIT4,CMSTAT ; SET BUFFER FULL FLAG
- CLR RBUF1 ; CLEAR BUFFER FOR NEXT CHAR
- AND %NOT2,CMSTAT ; RESET REC CHAR ACTIVE
- BR @RDTE ; CHECK DIBIT1 FOR START BIT
- *
- RCH2 RRC XDIBIT ; MOVE DIBIT0 TO
- RRC RBUF1 ; REC CHAR HOLD REG
- BR @RDTE ; CHECK DTE
- *
- CHKTO EQU $
- INC CWT1 ; COUNT TO ABOUT
- JNC OVTO1 ; 10 SECONDS
- INC CWT2
- JNC OVTO1
- BR @SQU03 ; IF NO CARRIER SQUELCH
- OVTO1 BR @RDTE ; ELSE CONTINUE
- PAGE
- *
- * SEND BIT TO THE 320
- * 320 just read from the latches
- *
- SRC3 EQU $
- TCNT BTJO %BIT3,CMSTAT,TCHR0 ; IS TRANS CHAR ACTIVE
- TSNDMK BR @SNDMK ; IF NOT SEND STOPBITS
- *
- TCHR0 CLR XDIBIT ; CLEAR OUT DIBIT REG
- SUB %1,XBTCNT ; CHECK POSITION
- JP TCHR3 ; > 2 MEANS TRANSMIT BITS
- TCHR1 EQU $
- BTJO %BIT5,CMSTAT,TCHR2 ; IS THE 2ND BUFFER FULL
- AND %NOT3,CMSTAT ; ELSE RESET TRANS ACTIVE
- JMP TSNDMK ; SEND THE STOP BIT
- *
- TCHR2 MOV XBUF2,XBUF1 ; MOVE BUF2 TO BUF1
- AND %NOT5,CMSTAT ; RESET BUF2 FULL FLAG
- OR %BIT7,CMSTAT ; SET FLAG FOR START BIT
- MOV %>A,XBTCNT ; RESET FULL CHAR COUNT
- JMP TSNDMK ; SEND THE STOP BIT
- *
- TCHR3 BTJZ %BIT7,CMSTAT,TCHR4 ; START BIT NEEDED
- AND %NOT7,CMSTAT ; RESET START BIT FLAG
- JMP TCHSD ; SET DIBIT TO START BIT
- TCHR4 EQU $
- CMP %1,XBTCNT ; IF BIT ONE THEN
- JEQ TSNDMK ; SEND FIRST STOP BIT
- RRC XBUF1 ; GET THE NEXT BIT
- JNC TCHSD ; IF ZERO THEN SEND
- OR %BIT0,XDIBIT ; ELSE SET BIT TO ONE
- TCHSD EQU $
- MOV XDIBIT,A ; HOLD IT FOR TRANSMIT
- OR %>20,A ; ADD TRANSMIT COMMAND
- MOVP %>3F,DDDR ; POINT DPORT OUT
- ANDP %>F0,DPORT ; CLEAR OUT DIBIT VALUE
- ORP A,DPORT ; SEND TO PORT
- ANDP %NOT6,BPORT ; Latch data into xmt.buffer
- ORP %BIT6,BPORT ; and reset Read Ack(RACK)
- MOVP %>00,DDDR ; Reset DPORT as all inputs
- BR @RDTE ; WAIT FOR RETURN LOOP
- *
- PAGE
- *******----------------------------------------*******
- ***** screen messages - text statements *****
- *******----------------------------------------*******
- BUFERR TEXT 'DTE BUFFER OVERFLOW ERROR'
- BYTE 0
- *
- *
- END